/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.sql.Date;
import model.Etudiant;
import model.Cour;
import model.Examen;
import model.Moyenne;
import model.Note;
import model.Personne;




public class DAOEtudiant{


    public void create(Etudiant obj) {
        String query2 = "INSERT INTO `personne`( `nom`, `prenom`, `dateNaissance`, `typeUtilisateur`, `login`, `password`) VALUES (?,?,?,?,?,?);";
        int nb = 0;
        int autoIncKeyFromApi = -1;
        PreparedStatement ps = null;
        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query2, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les
             * variables*
             */
            ps.setString(1, obj.getNom());
            ps.setString(2, obj.getPrenom());
            ps.setDate(3, obj.getDatenaissance());
            ps.setString(4, obj.getTypeUtilisateur());
            ps.setString(5, obj.getLogin());
            ps.setString(6, obj.getMdp());
            nb = ps.executeUpdate();//lancement de la requête
            ResultSet rs = ps.getGeneratedKeys();//recupération du résultat
            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                String query = "INSERT INTO `etudiant`(`id_personne`) VALUES (" + autoIncKeyFromApi + ");";
                System.out.println(query);
                ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
                nb = ps.executeUpdate();
                System.out.println(nb);
            }

        } catch (SQLException e) {
            e.printStackTrace();

        }
    }
    
    
    public Etudiant rechercheEtudiant(String login, String mdp) throws SQLException {

            PreparedStatement st = null;
            Etudiant p=null;
            try {
                Connection conn = DBConnection.getConnection();
                String query = "select p.login,p.password,p.nom,p.prenom,e.id_eleve,e.id_personne,p.typeUtilisateur from personne p,etudiant e where p.login='"+login+"' and p.password='"+mdp+"' and p.id_personne=e.id_personne;";
                st = conn.prepareStatement(query);
                ResultSet res = st.executeQuery(query);
                if(res.next()){
                  
                    String log = res.getString("login");
                    String password = res.getString("password");
                   String nom= res.getString("nom");
                   String prenom=res.getString("prenom");
                   int idp=res.getInt("id_personne");
                   int ide=res.getInt("id_eleve");
                   String type=res.getString("typeUtilisateur");
                   java.sql.Date d =null;
                    p = new Etudiant(ide,idp,nom,prenom,d,type,log,password);
                    System.out.println(log+ide+idp+type);
                }
                }catch(SQLException e){
                    e.printStackTrace();
            }
           
            return p;
             } 

    
    public void update(int idEtudiant) {
         String query = "SELECT id_personne FROM etudiant WHERE id_eleve = '"+idEtudiant+"'";
        int nb = 0;
        boolean del = false;
         Statement st = null;
         int idPersonne = 0;
        try {
            Connection conn = DBConnection.getConnection();
            st = conn.createStatement();
                 
        /** remplacement des points d'interogation dans la query par les variables**/  
            
            ResultSet res = st.executeQuery(query);//lancement de la requête
            while (res.next()) {
                 idPersonne = res.getInt("id_personne");
            }
            Personne p = new Personne(idPersonne);
           DAOPersonne x = new DAOPersonne();
           x.update(p);
            if(nb >= 1) {
                del = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
    }

    public boolean delete(Personne obj) {
        boolean del = false;
         String query = "DELETE FROM `personne` WHERE `id_personne`=";
        Integer nb = 0;
        int autoIncKeyFromApi = -1;
        PreparedStatement ps = null;
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
            System.out.println(ps);
            /**
             * remplacement des points d'interogation dans la query par les
             * variables*
             */
           ps.setObject(1, obj.getId());
          System.out.println(obj.getId());
           // System.out.println(obj.getId());
            nb = ps.executeUpdate();//lancement de la requête
            ResultSet rs = ps.getGeneratedKeys();//recupération du résultat
            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
                System.out.println(nb);
            }
            if (nb >= 1) {
                del = true;
            }
         } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;
    }

    public ArrayList<Personne> getAll() {
        String query = "SELECT nom, prenom, dateNaissance FROM personne where typeUtilisateur = 'etudiant'";
        ArrayList<Personne> etudiants = new ArrayList<Personne>();
        Personne personne = null;
         Integer nb = 0;
        int autoIncKeyFromApi = -1;
        Statement ps = null;
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
           
            while (res.next()) {//récuperation de l'id 
                String nom = res.getString("nom");
                String prenom = res.getString("prenom");
                Date dateNaissance = res.getDate("dateNaissance");
                personne = new Personne(nom,prenom,dateNaissance);
            }
         } catch (SQLException e) {
            e.printStackTrace();
        }
        return etudiants;
    }

    public Etudiant find(int id) {
        String query = "";
        Etudiant etudiant = null;
        etudiant = findGeneral(query).get(0);
        return etudiant;
    }
    
        public  ArrayList<Moyenne> affMoyennes(Etudiant etu) throws SQLException {


      //  DAOEtudiant e = new DAOEtudiant();
        DAOCour c = new DAOCour();
        ArrayList<Cour> cours = new ArrayList<Cour>();
        ArrayList<Examen> examens = new ArrayList<Examen>();
        Note note;
        ArrayList<Moyenne> tableau=new ArrayList<Moyenne>();
      //  Etudiant etu = e.rechercheEtudiant(login, mdp);
        cours = c.findCours(etu.getId());//recherche de tous les cours de l'etudiant
        for (Cour cour : cours) {

            float addNote = 0;
            int nbNote = 0;

            int noCour = cour.getIdCour();

            DAOExamen daoe = new DAOExamen();
            examens = daoe.getExamFromCour(noCour);//recupère tous les exam depuis un cour
            for (Examen exam : examens) {//boucle sur tous les exam

                DAONote daon = new DAONote();
                note = daon.findNoteEtudiantExam(etu.getId(), exam.getId());//récuperation de la note de l'exam
                if (note != null) {
                    nbNote += 1;
                    addNote += note.getNote();
                }
            }
            if (nbNote != 0) {
                tableau.add(new Moyenne(cour.getNomCour(),cour.getCoefCour(),addNote/nbNote));
            }

        }

   
        return tableau;
    }
        


//---------------------------------------------------------private method--------------------------------------------------------------------//
  

    /**
     * Permet la suppression d'une entrée de la base
     *
     * @param obj
     */
    
    
    private ArrayList<Etudiant> findGeneral(String requete) {
        ArrayList<Etudiant> etudiants = new ArrayList<Etudiant>();
        Statement st = null;
        Etudiant etudiant = null;
        return etudiants;
    }

    public ArrayList<Cour> findCours(int idEleve) throws SQLException {
        PreparedStatement st = null;
        ArrayList<Cour> listeCours = new ArrayList<Cour>();
        try {
            String query = "select c.nom from cour c, etudiant e where e.id_eleve='1'";
            //String query = "select c.nom from cour c, etudiant e where e.id_eleve='" + idEleve + "'";
            Connection conn = DBConnection.getConnection();
            st = conn.prepareStatement(query);
            ResultSet rs = st.executeQuery();
            while (rs.next()) {
                String nomCours = rs.getString("nom");
                float coeff = rs.getFloat("coefficient");
                Cour c = new Cour(nomCours,coeff);
                listeCours.add(c);
            }
            //System.out.println("L'étudiant a les cours suivants :/n");
            /*
            for (Cour cours : listeCours) {
                System.out.println(cours.getNomCour());
            }
            * */
        } finally {
            if (st != null) {
                st.close();
            }
        }
        return listeCours;
    }

   
}
